<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;

$this->title = '将日志存放到数据库中-DbTarget-Log-Components组件';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'yii,yii2,框架,应用组件,Components,使用,教程,log,DbTarget'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => 'DbTarget可以将日志记录到数据库，这使得我们可以很方便地开发网页日志报表，不用进入服务器（数据库）即可查看日志，而数据库操作是极具危险性的，一般情况下是不允许频繁登录生产数据库后或者服务器。'
]);


$html = [
    "概述" => <<<HTML
# 将日志记录到数据库中
`yii\log\DbTarget`可以将日志记录到数据库，这使得我们可以很方便地开发网页日志报表，在不进入服务器（数据库）的情况下即可查看日志，而数据库操作是极具危险性的，一般情况下是不允许频繁登录生产数据库后或者生产服务器。

HTML,
    "CONFIG" => <<<HTML
## 配置举例 id=config
常见的配置如下：
```php
[
    'components' => [
        'log' => [
            'flushInterval' => 1,
            'traceLevel' => 0,
            'targets' => [
                // 可以指定key，便于访问
                'db' => [
                    'logVars' => [],
                    'class' => 'yii\log\DbTarget',
                    'categories' => ['user'],
                    'exportInterval' => 1,
                ],
            ],
        ],
    ],
]
```
> **注意：**您需要把这个配置放到`common/config`下，确保控制台应用可以加载到此配置，否则无法使用`migrate`创建所需的数据表。


HTML,
    "migrate" => <<<HTML
## 创建Log数据表 id=migrate
既然要将日志存储到数据库中，那数据库中应该存在一张专门记录日志的表，庆幸的是您不用烦恼去设计表结构，Yii已经给我们提供了默认的日志数据表，您只需要在命令行下执行[migrate](/docs/structure/controller/console#migrate)命令即可：
```php
yii migrate --migrationPath=@yii/log/migrations/
```
> **注意：**migrate工具其实是一种控制台应用，它要求控制台应用主体中至少有一个`DbTarget`配置，因此建议将日志配置放到`common/config`目录中，确保控制台可以加载到。

创建好的表结构如下：
```shell
mysql> desc log;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| level    | int(11)      | YES  | MUL | NULL    |                |
| category | varchar(255) | YES  | MUL | NULL    |                |
| log_time | double       | YES  |     | NULL    |                |
| prefix   | text         | YES  |     | NULL    |                |
| message  | text         | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
```
HTML,
    "use" => <<<HTML
## 如何使用 id=use
创建日志的方式和`fileTarget`是一致的：
```php
Yii::info("log数据库测试", "user");
```
此时会在数据库中创建一条记录：
```shell
mysql> select * from log;
+----+-------+----------+-----------------+--------------------+-------------+
| id | level | category | log_time        | prefix             | message     |
+----+-------+----------+-----------------+--------------------+-------------+
|  1 |     4 | user     | 1640857579.0326 | [172.23.0.1][-][-] | log db test |
+----+-------+----------+-----------------+--------------------+-------------+
```
HTML,
    "db" => <<<HTML
## 多数据库选择 id=db
一个大型的应用可能包含多个数据库，比如业务数据库、日志数据库，此时我们在配置文件中会有多个数据库的配置：
```php
'components' => [
    // 业务数据库
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=172.23.0.2;dbname=cms',
        'username' => 'root',
        'password' => 'verysecret',
        'charset' => 'utf8',
    ],
    // 日志数据库
    'log_db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=172.23.0.2;dbname=cms_log',
        'username' => 'root',
        'password' => 'verysecret',
        'charset' => 'utf8',
    ],
]
```
此时我们可以在配置`DbTarget`的时候指定日志要存放到哪个数据库的哪张表中，您需要用到如下配置：
```php
'log' => [
    'flushInterval' => 1,
    'traceLevel' => 0,
    'targets' => [
        [
            'logVars' => [],
            'class' => 'yii\log\DbTarget',
            'categories' => ['user'],
            'exportInterval' => 1,
            'db' => 'log_db', // 指定日志数据库的组件id
            'logTable' => 'log_' . date('Y-m-d') // 指定表名
        ],
    ],
],
```
HTML,
    "" => <<<HTML

HTML,
];

// Yii::info("log log_db test", "user");die;
// var_dump(Yii::$app->log->targets["login"]->messages = ["test", "info", "login"]);die;
// die;

echo Markdown::widget(["content" => implode("\n", $html)]);

